package com.rjj.wlqq.listen.handle;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * 如果实现了Filter 直接添加 @Bean就可以实现自动添加过滤器了
 */
public class SystemUrlFilter implements Filter {
    Logger log = LoggerFactory.getLogger(SystemUrlFilter.class);
    private String[] prefixIignores;

    @Override
    public void init(FilterConfig config) throws ServletException {
        String ignoresParam = config.getInitParameter("exclusions");
        if (StringUtils.isNotEmpty(ignoresParam)) {
            prefixIignores = ignoresParam.split(",");
        }
        log.info("SystemUrlFilter-init");
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;

        //不需要过滤的
        if (canIgnore(request)) {
            chain.doFilter(request, response);
            return;
        }
        //需要过滤的
        try {
           // 执行我想要执行的事情然后提交下一个过滤器
            log.info("第二种方式的过滤器执行：拦截到的地址是" + request.getRequestURI());
            chain.doFilter(request, response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void destroy() {
        prefixIignores = null;
    }

    /**
     *
     * registrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico");
     * 这里写的这些有的是大概的：*.jpg 这个equal是不可以判断的
     * 这里加了正则过滤
     *
     *
     * 当前访问是不是需要过滤的：
     *   是：直接下一部
     *   不是：进行过滤操作
     *
     * @param request 请求
     * @return 是否需要过滤
     */
    private boolean canIgnore(HttpServletRequest request) {
        boolean isExcludedPage = false;
        // 判断是否在过滤url之外
         for (String page : prefixIignores) {
             String str = page.replaceAll("\\*", "").replaceAll("\\.",".+(")+")$";
             //log.info("过滤的配置：{},访问的地址：{},拼接过滤正则表达式：{}",page,request.getServletPath(),str);
             if (request.getServletPath().equals(page) || request.getServletPath().matches(str)) {
                 log.info("是否要除去：{}",true);
                isExcludedPage = true;
                break;
            }
        }
        return isExcludedPage;
    }
}